#include <REGX52.H>
#include "LCD1602.h"
#include "DS1302.h"
#include "timer0.h"
#include "key.h"

// 数组索引0-6，分别位年、月、日、时、分、秒、星期
unsigned char DS1302_timeArr[] = {24, 3, 15, 14, 20, 58, 5};
// 独立按键，操作模式（修改/显示），时间位置，时间闪烁标志
unsigned char keyNumber, mode, timePosition, timeFlashFlag;

/** @bref 从DS1302中读取时间并显示在LCD1602上
  * @param 无
  * @retval 无
  */ 
void timeShow()
{
		// 从DS1302中读取时间
		DS1302_getTime(DS1302_timeArr);

		LCD_ShowNum(1, 1, DS1302_timeArr[0], 2);
		LCD_ShowNum(1, 4, DS1302_timeArr[1], 2);
		LCD_ShowNum(1, 7, DS1302_timeArr[2], 2);
		LCD_ShowNum(2, 1, DS1302_timeArr[3], 2);
		LCD_ShowNum(2, 4, DS1302_timeArr[4], 2);
		LCD_ShowNum(2, 7, DS1302_timeArr[5], 2);
}

/** @bref 调整时间
  * @param 无
  * @retval 无
  */ 
void timeSet()
{
	// 若是按键2按下（切换时间位置）
	if(keyNumber == 2)
	{
		timePosition++;
		// 越界清0
		timePosition %= 6;
	}
	// 若是按键3按下（所选时间位置数值增加）
	else if(keyNumber == 3)
	{
		// 时间数值增加
		DS1302_timeArr[timePosition]++;
		// 若年超过99
		if(DS1302_timeArr[0] > 99)
		{
			DS1302_timeArr[0] = 0;
		}
		// 若月超过12
		if(DS1302_timeArr[1] > 12)
		{
			DS1302_timeArr[1] = 1;
		}
		// 日的越界判断(大月）
		if(DS1302_timeArr[1] == 1 || DS1302_timeArr[1] == 3 || DS1302_timeArr[1] == 5 ||
			DS1302_timeArr[1] == 7 || DS1302_timeArr[1] == 8 || DS1302_timeArr[1] == 10 ||
			DS1302_timeArr[1] == 12)
		{
			if(DS1302_timeArr[2] > 31)
			{
				DS1302_timeArr[2] = 1;
			}
		}
		// 日的越界判断(小月）
		else if(DS1302_timeArr[1] == 4 || DS1302_timeArr[1] == 6 || DS1302_timeArr[1] == 9 ||
			DS1302_timeArr[1] == 11)
		{
			if(DS1302_timeArr[2] > 30)
			{
				DS1302_timeArr[2] = 1;
			}
		}
		// 日的越界判断(闰年）
		else if(DS1302_timeArr[1] == 2)
		{
			// 普通年能被4整除而不能被100整除的为闰年
			if((DS1302_timeArr[0] % 4 == 0) && (DS1302_timeArr[0] % 100 != 0))
			{
				if(DS1302_timeArr[2] > 29)
				{
					DS1302_timeArr[2] = 1;
				}
			}
			// 世纪年能被400整除而不能被3200整除的为闰年
			else if((DS1302_timeArr[0] % 400 == 0) && (DS1302_timeArr[0] % 3200 != 0))
			{
				if(DS1302_timeArr[2] > 29)
				{
					DS1302_timeArr[2] = 1;
				}
			}
			// 若不是闰年
			else
			{
				if(DS1302_timeArr[2] > 28)
				{
					DS1302_timeArr[2] = 1;
				}
			}
		}
		// 若时超过23
		if(DS1302_timeArr[3] > 23)
		{
			DS1302_timeArr[3] = 0;
		}
		// 若分超过59
		if(DS1302_timeArr[4] > 59)
		{
			DS1302_timeArr[4] = 0;
		}
		// 若秒超过59
		if(DS1302_timeArr[5] > 59)
		{
			DS1302_timeArr[5] = 0;
		}
	}
	// 若是按键4按下（所选时间位置数值增加）
	else if(keyNumber == 4)
	{
		// 时间数值减少
		DS1302_timeArr[timePosition]--;
		// 若年小于0
		if(DS1302_timeArr[0] < 0)
		{
			DS1302_timeArr[0] = 99;
		}
		// 若月小于0
		if(DS1302_timeArr[1] < 0)
		{
			DS1302_timeArr[1] = 12;
		}
		// 日的越界判断(大月）
		if(DS1302_timeArr[1] == 1 || DS1302_timeArr[1] == 3 || DS1302_timeArr[1] == 5 ||
			DS1302_timeArr[1] == 7 || DS1302_timeArr[1] == 8 || DS1302_timeArr[1] == 10 ||
			DS1302_timeArr[1] == 12)
		{
			if(DS1302_timeArr[2] < 0)
			{
				DS1302_timeArr[2] = 31;
			}
		}
		// 日的越界判断(小月）
		else if(DS1302_timeArr[1] == 4 || DS1302_timeArr[1] == 6 || DS1302_timeArr[1] == 9 ||
			DS1302_timeArr[1] == 11)
		{
			if(DS1302_timeArr[2] < 0)
			{
				DS1302_timeArr[2] = 30;
			}
		}
		// 日的越界判断(闰年）
		else if(DS1302_timeArr[1] == 2)
		{
			// 普通年能被4整除而不能被100整除的为闰年
			if((DS1302_timeArr[0] % 4 == 0) && (DS1302_timeArr[0] % 100 != 0))
			{
				if(DS1302_timeArr[2] < 0)
				{
					DS1302_timeArr[2] = 29;
				}
			}
			// 世纪年能被400整除而不能被3200整除的为闰年
			else if((DS1302_timeArr[0] % 400 == 0) && (DS1302_timeArr[0] % 3200 != 0))
			{
				if(DS1302_timeArr[2] < 0)
				{
					DS1302_timeArr[2] = 29;
				}
			}
			// 若不是闰年
			else
			{
				if(DS1302_timeArr[2] > 28)
				{
					DS1302_timeArr[2] = 1;
				}
			}
		}
		// 若时小于0
		if(DS1302_timeArr[3] < 0)
		{
			DS1302_timeArr[3] = 23;
		}
		// 若分小于0
		if(DS1302_timeArr[4] < 0)
		{
			DS1302_timeArr[4] = 59;
		}
		// 若秒小于0
		if(DS1302_timeArr[5] < 0)
		{
			DS1302_timeArr[5] = 59;
		}

		// 更新显示，根据timePosition和timeFlashFlag判断即可完成闪烁功能
		if(timePosition == 0 && timeFlashFlag == 1)
		{
			LCD_ShowString(1, 1, "  ");
		}
		else
		{
			LCD_ShowNum(1, 1, DS1302_timeArr[0], 2);
		}
		
		if(timePosition == 1 && timeFlashFlag == 1)
		{
			LCD_ShowString(1, 4, "  ");
		}
		else
		{
			LCD_ShowNum(1, 4, DS1302_timeArr[1], 2);
		}
		
		if(timePosition == 2 && timeFlashFlag == 1)
		{
			LCD_ShowString(1, 7, "  ");
		}
		else
		{
			LCD_ShowNum(1, 7, DS1302_timeArr[2], 2);
		}
		
		if(timePosition == 3 && timeFlashFlag == 1)
		{
			LCD_ShowString(2, 1, "  ");
		}
		else
		{
			LCD_ShowNum(2, 1, DS1302_timeArr[3], 2);
		}
		
		if(timePosition == 4 && timeFlashFlag == 1)
		{
			LCD_ShowString(2, 4, "  ");
		}
		else
		{
			LCD_ShowNum(2, 4, DS1302_timeArr[4], 2);
		}
		
		if(timePosition == 5 && timeFlashFlag == 1)
		{
			LCD_ShowString(2, 7, "  ");
		}
		else
		{
			LCD_ShowNum(2, 7, DS1302_timeArr[5], 2);
		}
	}
}

void main()
{
	LCD_Init();
	DS1302_init();
	timer0_init();
	
	LCD_ShowString(1, 1, "  -  -  ");
	LCD_ShowString(2, 1, "  :  :  ");
	
	// 设置时间到DS1302中
	DS1302_setTime(DS1302_timeArr);
	
	while(1)
	{
		keyNumber = getKeyNumber();
		// 按键1：调整时间/显示时间切换
		if(keyNumber == 1)
		{
			if(mode == 0)
			{
				mode = 1;
				// 默认选择第一位（年）
				timePosition = 0;
			}
			else if(mode == 1)
			{
				mode = 0;
				// 设置时间到DS1302中
				DS1302_setTime(DS1302_timeArr);
			}
		}
		// 根据不同的功能执行不同的函数
		switch(mode)
		{
			case 0: timeShow();break;
			case 1: timeSet();break;
		}
	}
}

void Time0_Rountine() interrupt 1
{
	static unsigned int t0Count;
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	
	t0Count++; //t0Count计次，对中断频率进行分频
	// 分频500次，大于500ms，计数器重置为0
	if(t0Count >= 500)
	{
		t0Count = 0;
		// 闪烁标志位取反（每500ms）
		timeFlashFlag = !timeFlashFlag;
	}
}
